home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d20
/
pvert.arc
/
QWK2PKT.C
< prev
next >
Wrap
Text File
|
1992-01-15
|
9KB
|
355 lines
#ifdef OS2
#define INCL_DOS
#include <os2.h>
#endif
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "qwk.h"
#include "xqwk.h"
#include "xmsg.h"
#include "pkt.h"
#include "addr.h"
PKTHDR * fill_in_pkt_hdr (PKTHDR *pkt,ADDR *myaddr,ADDR *addr,char *password);
int write_pkt_msg (FILE *fp,XMSG *amsg,char *text,char *area);
extern char * rstrip (char *);
extern char * stripcr (char *);
extern char * stristr (char *t, char *s);
int main (int argc,char *argv[]) {
ADDR from,to;
XMSG msg;
char *p,s[QWKBLKSIZE + 1],*hold,bbsid[9] = "",pktname[13];
char qwkpkt[13] = "MESSAGES.DAT";
FILE *pkt,*qwk;
int c,error,isrep = 0,makelist = 0;
long numareas,nummsgs = 0L,secs;
QWKAREAS *head,*info,*lastarea = NULL;
struct stat st;
PKTHDR pkthdr;
time_t start;
printf("\n P-VERT"
"\nQWK2PKT; converts QWK packets to Fidonet type 2 packets.\n");
start = time(NULL);
if(argc < 3) {
printf("\nUsage: QWK2PKT <from_address> <to_address> [-R(eplypkt)] [-T(able)]\n");
return 1;
}
memset(&from,0,sizeof(ADDR));
memset(&to,0,sizeof(ADDR));
p = argv[1];
if(parse_addr(&p,&from,NULL)) {
printf("\nInvalid <from_address> -- must be 5-D Fidonet format"
"\nexample: 1:380/16.0@Fidonet\n");
return 2;
}
p = argv[2];
if(parse_addr(&p,&to,NULL)) {
printf("\nInvalid <to_address> -- must be 5-D Fidonet format"
"\nexample: 1:380/16.0@Fidonet\n");
return 3;
}
for(c = 3;c < argc;c++) {
p = argv[c];
while(*p == '/' || *p == '-') p++;
switch(toupper(*p)) {
case 'R': isrep = 1;
break;
case 'T': makelist = 1;
break;
default: printf("\nUnknown option \"%c\"\n",*p);
break;
}
}
qwk = fopen("CONTROL.DAT","rt");
if(!qwk) {
printf("\nCan't open CONTROL.DAT\n");
return 4;
}
for(c = 0;c < 5;c++) {
if(!fgets(s,80,qwk)) {
fclose(qwk);
printf("\nCONTROL.DAT is screwed\n");
return 5;
}
}
stripcr(s);
rstrip(s);
p = strchr(s,',');
if(p && *(++p)) strncpy(bbsid,p,8);
bbsid[8] = 0;
for(c = 5;c < 10;c++) {
if(!fgets(s,80,qwk)) {
fclose(qwk);
printf("\nCONTROL.DAT is screwed\n");
return 5;
}
}
head = qwkarearead(qwk,&numareas);
fclose(qwk);
if(!head) {
printf("\nCONTROL.DAT is screwed or out of memory, take your pick.\n");
return 6;
}
printf("\nProcessing %ld area%s\n",numareas,&"s"[numareas == 1L]);
if(isrep) {
if(*bbsid) sprintf(qwkpkt,"%s.MSG",bbsid);
else strcpy(qwkpkt,"MESSAGES.MSG");
}
qwk = fopen(qwkpkt,"rb");
if(!qwk) {
printf("\nCan't open %s\n",qwkpkt);
qwkfreeareas(head);
return 7;
}
if(!qwkreadblk(qwk,s) || !stristr(s,"copyright")) {
fclose(qwk);
qwkfreeareas(head);
printf("\n%s is screwed\n",qwkpkt);
return 8;
}
if(*bbsid) {
sprintf(s,"%s.PKT",bbsid);
}
else {
sprintf(s,"%lx.PKT",time(NULL));
while(!stat(s,&st)) {
sprintf(s,"%lx.PKT",time(NULL));
}
}
strcpy(pktname,s);
pkt = fopen(pktname,"wb");
if(!pkt) {
fclose(qwk);
printf("\nCan't open packet %s\n",pktname);
qwkfreeareas(head);
return 9;
}
printf("Building %s\n",pktname);
if(fwrite(fill_in_pkt_hdr(&pkthdr,&from,&to,""),1,sizeof(PKTHDR),pkt) == 65535U) {
printf("\nError writing to packet %s\n",pktname);
fclose(qwk);
fclose(pkt);
qwkfreeareas(head);
return 10;
}
fwrite("\0",2,1,pkt);
fseek(pkt,ftell(pkt) - 2L,SEEK_SET);
while(!feof(qwk)) {
#ifdef OS2
DosSleep(0L);
#endif
msg.orig = from.node;
msg.dest = to.node;
msg.orig_net = from.net;
msg.dest_net = to.net;
msg.o_zone = msg.d_zone = 0;
msg.o_point = msg.d_point = 0;
info = xreadqwkmsg(qwk,&msg,&hold,head,&error,isrep);
if(!info || !hold || error != MSG_NOERR) {
if(!info && error == MSG_BADAREA) {
if(hold) free(hold);
printf("\n? Unknown area skipped...\n");
lastarea = NULL;
continue;
}
if(error != MSG_NOERR && error != MSG_NOTEXT &&
error != MSG_NOMOREMSGS) {
printf("\nError %d, errno = %d; aborting...\n",error,errno);
fclose(qwk);
fclose(pkt);
qwkfreeareas(head);
return 11;
}
if(error == MSG_NOMOREMSGS) {
if(hold) free(hold);
break;
}
if(error == MSG_NOTEXT) {
if(hold) free(hold);
continue;
}
}
if(lastarea != info) {
printf("\n%s ",info->name);
lastarea = info;
}
printf("%-09ld\b\b\b\b\b\b\b\b\b",++nummsgs);
write_pkt_msg(pkt,&msg,hold,info->name);
free(hold);
}
fclose(qwk);
fclose(pkt);
printf("\n\nRuntime: %ld mins %ld secs for %ld message%s",
(time(NULL) - start) / 60L,(time(NULL) - start) % 60L,
nummsgs,&"s"[nummsgs == 1]);
if(nummsgs && !stat(qwkpkt,&st)) {
numareas = st.st_size;
if(!stat(pktname,&st)) {
printf("\n\nSpace difference, QWK - PKT: %ld byte%s (not counting indexes, etc.)\n",
numareas - st.st_size,&"s"[(numareas - st.st_size) == 1L]);
if(numareas > st.st_size) { /* negatives screw up simple-minded calculation */
secs = (long)max(1L,(((((numareas - st.st_size) * 10L) / 2400L) * 100L) / 80L));
if(secs) printf("Approximately %ld percent, or %ld second%s @ 2400 baud.\n",
100L - ((st.st_size * 100L) / numareas),secs,&"s"[secs == 1L]);
}
}
}
if(!nummsgs || stat(pktname,&st) || st.st_size < 61L) {
unlink(pktname);
printf("\nProblem conversion: no cleanup.\n");
}
else {
printf("\nCleaning up");
unlink("CONTROL.DAT");
unlink("DOOR.ID");
unlink(qwkpkt);
info = head;
if(makelist) {
p = strchr(pktname,'.');
if(p) {
*p = 0;
strcat(pktname,".TBL");
qwk = fopen(pktname,"wt");
if(!qwk) makelist = 0;
else printf(" and building area table");
}
else makelist = 0;
}
printf(".\n");
while(info) {
if(makelist) {
fprintf(qwk,"%d,%s\n",info->confnum,info->name);
}
sprintf(s,"%03d.NDX",info->confnum - 1);
unlink(s);
info = info->next;
}
if(makelist) fclose(qwk);
}
qwkfreeareas(head);
return 0;
}
PKTHDR * fill_in_pkt_hdr (PKTHDR *pkt,ADDR *myaddr,ADDR *addr,char *password) {
memset(pkt,0,sizeof(PKTHDR));
pkt->onode = myaddr->node;
pkt->onet = myaddr->net;
pkt->ozone = myaddr->zone;
pkt->opoint = myaddr->point;
pkt->dnode = addr->node;
pkt->dnet = addr->net;
pkt->dpoint = addr->point;
pkt->dzone = addr->zone;
strncpy(pkt->odomain,myaddr->domain,8);
strncpy(pkt->ddomain,addr->domain,8);
strncpy(pkt->password,password,8);
pkt->version = 2;
pkt->subver = 2;
pkt->product = 0;
pkt->rev_lev = 0;
return pkt;
}
int write_pkt_msg (FILE *fp,XMSG *amsg,char *text,char *area) {
char pmsg[192],*p;
unsigned int x;
/* Write the message given to the end of the file given as a
packed msg */
memset(pmsg,192,0);
*pmsg = 0x02;
pmsg[1] = 0x00;
memcpy(&pmsg[2],&amsg->orig,2);
memcpy(&pmsg[4],&amsg->dest,2);
memcpy(&pmsg[6],&amsg->orig_net,2);
memcpy(&pmsg[8],&amsg->dest_net,2);
memcpy(&pmsg[10],&amsg->attr,2);
x = 0;
memcpy(&pmsg[12],&x,2);
for(x = 0;x < 20;x++) if(!amsg->date[x]) amsg->date[x] = 'Q';
amsg->date[19] = 0;
memcpy(&pmsg[14],amsg->date,20);
p = &pmsg[34];
strcpy(p,amsg->to);
x = 34;
while(*p){
x++;
p++;
}
p++;
x++;
strcpy(p,amsg->from);
while(*p){
x++;
p++;
}
x++;
p++;
strcpy(p,amsg->subj);
while(*p){
x++;
p++;
}
x++;
p++;
fwrite(pmsg,x,1,fp);
if(area && *area) { /* Prepend area tag */
fprintf(fp,"AREA: %s\r",area);
}
fwrite(text,strlen(text),1,fp);
fwrite("\0\0",3,1,fp);
fseek(fp,(ftell(fp) - 2L),SEEK_SET); /* Ready for another msg */
return 1;
}